package com.saianfu.flowable.demo.common

import org.flowable.engine.task.Comment

/**
 * 流程任务相关封装
 *
 */
interface ActTask {
    /**
     * 为流程任务设置变量。
     * 如果变量尚未存在，则将在任务中创建该变量。
     *
     * @param taskId        任务的id，不能为null.
     * @param variableName  变量键名.
     * @param variableValue 变量键值.
     * @throws
     */
    fun setVariableLocal(taskId: String, variableName: String, variableValue: Any?)

    /**
     * 为流程任务设置多对变量。
     * 如果变量尚未存在，则将在任务中创建该变量。
     *
     * @param taskId    任务的id，不能为null.
     * @param variables 多对变量键值对.
     * @throws
     */
    fun setVariablesLocal(taskId: String, variables: Map<String, Any?>)

    /**
     * 任务签收。
     *
     * @param taskId 任务的id，不能为null.
     * @param userId 签收人标识.
     * @return
     * @throws Exception
     */
    @Throws(Exception::class)
    fun claim(taskId: String, userId: String)

    /**
     * 任务反签收
     *
     * @param taskId 任务的id，不能为null.
     * @return
     * @throws Exception
     */
    @Throws(Exception::class)
    fun unclaim(taskId: String)

    /**
     * 执行任务
     *
     * @param taskId 任务的id，不能为null.
     * @throws Exception
     */
    @Throws(Exception::class)
    fun complete(taskId: String)

    /**
     * 执行任务，并设置任务变量。
     *
     * @param taskId    任务的id，不能为null.
     * @param variables 任务变量.
     * @return
     * @throws Exception
     */
    @Throws(Exception::class)
    fun complete(taskId: String, variables: Map<String, Any?>?)

    /**
     * 执行任务，并设置任务变量。
     *
     * @param taskId     任务的id，不能为null.
     * @param variables  任务变量.
     * @param localScope 存储范围。如果为true，则提供的变量将存储在任务本地（当任务结束后，再也取不到这个值），
     * 而不是流程实例范围（默认是存放在流程实例中）。
     * @return
     * @throws
     */
    fun complete(taskId: String, variables: Map<String, Any?>?, localScope: Boolean): Map<String, Any?>?

    /**
     * 任务移交：将任务的所有权转移给其他用户。
     *
     * @param taskId 任务的id，不能为null.
     * @param userId 接受所有权的人.
     */
    fun setAssignee(taskId: String, userId: String?)

    /**
     * 任务委派
     *
     * @param taskId 任务的id，不能为null.
     * @param userId 被委派人ID.
     */
    fun delegate(taskId: String, userId: String?)

    /**
     * 委派任务完成，归还委派人
     *
     * @param taskId 任务的id，不能为null.
     */
    fun resolveTask(taskId: String)

    /**
     * 更改任务拥有者
     *
     * @param taskId 任务的id，不能为null.
     * @param userId 任务拥有者.
     */
    fun setOwner(taskId: String, userId: String?)

    /**
     * 删除任务
     *
     * @param taskId 任务的id，不能为null.
     */
    fun delete(taskId: String)

    /**
     * 删除任务，附带删除理由
     *
     * @param taskId 任务的id，不能为null.
     * @param reason 删除理由.
     */
    fun deleteWithReason(taskId: String, reason: String?)

    /**
     * 为任务添加任务处理人。
     *
     * @param taskId 任务的id，不能为null.
     * @param userId 任务处理人ID.
     * @throws Exception
     */
    @Throws(Exception::class)
    fun addCandidateUser(taskId: String, userId: String?)

    /**
     * 为流程任务 和/或 流程实例添加注释。
     *
     * @param taskId            流程任务ID.
     * @param processInstanceId 流程实例ID.
     * @param message           注释信息
     * @return
     * @throws Exception
     */
    @Throws(Exception::class)
    fun addComment(taskId: String, processInstanceId: String, message: String?): Comment?

    /**
     * 查询与任务相关的注释信息。
     *
     * @param taskId 流程任务ID.
     * @return
     * @throws Exception
     */
    @Throws(Exception::class)
    fun getTaskComments(taskId: String): List<Comment>
}